<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script src="./Lodash/lodash.js"></script>
  </head>

  <body>
    <script>
      let person = {
        name: "陈述",
        hooby: ["买花"],
      };
      // 浅拷贝如果通过函数 的方式时开辟一个新的对象 则基本的数据类型不会改变 引用数据类型会变
      function shallow(source) {
        let obj22 = {};
        for (const k in person) {
          obj22[k] = source[k];
        }
        return obj22;
      }
      const zkss = shallow(person);
      zkss.name = "55";
      zkss.hooby[0] = "逛街";
      console.log(zkss, person);

      // var obj1 = {
      //   name: "tim",
      //   msg: {
      //     age: 29,
      //   },
      // };
      // // 1.直接赋值相当于地址的引用
      // var obj2 = obj1;
      // obj2.name = "jim";
      // console.log(obj1, obj2); //jim
      // console.log(obj1 === obj2); //true

      // // // 2.浅拷贝只会拷贝最外面的一层，里面的对象拷贝的是地址，即引用，修改时会连着修改
      // // var obj3 = {}
      // // for (k in obj1) {
      // //     obj3[k] = obj1[k]
      // // }
      // // obj3.msg.age = 30
      // // console.log(obj1); //obj1.msg.age的值也会变成30，说明引用的同一块地址

      // // 3.ES6中的浅拷贝
      // var objzks01 = {};
      // // Object.assign es6的方法(拷贝的新目标， 被拷贝的对象)  返回修改后的对象
      // // 拷贝不等于赋值  会重新开辟区间

      // Object.assign(objzks01, obj1);

      // objzks01.name = "alice";
      // console.log(obj1, "b4", objzks01); //tim 30

      // // 6.深拷贝：每一层的数据都会被拷贝，开辟的都是新的空间。
      var obj = {
        name: "tim",
        color: ["white", "black"],
        size: {
          content: "small",
        },
        say() {},
        a: undefined,
      };
      // 深拷贝
      //1. 缺点 不会拷贝函数类型 undefined类型
      var zks = JSON.parse(JSON.stringify(obj));
      // console.log(zks, "序列号");

      // 2.lodash使用

      var deepLod = _.cloneDeep(obj);

      console.log(deepLod === obj, "loda");

      var obj2 = {};
      // 以下为通过函数递归的方式实现深拷贝
      function deepCopy(newobj, old) {
        for (const i in old) {
          if (old[i] instanceof Array) {
            newobj[i] = []; //o.color=[] 相当于执行了

            deepCopy(newobj[i], old[i]); //o.color=['pink']
          } else if (old[i] instanceof Object) {
            newobj[i] = {};
            deepCopy(newobj[i], old[i]);
          } else {
            newobj[i] = old[i];
          }
        }
      }
      deepCopy(obj2, obj);
      console.log(obj2, "深拷贝");
    </script>
  </body>
</html>
